package service

import (
	"context"
	"errors"
	"fmt"
	"gitee.com/chunanyong/logger"
	"gitee.com/chunanyong/zorm"
	_ "time"
	"zorm-learn/app/query/model"
)

// SaveSysCasbinRuleStruct 保存
// 如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
// 如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
// 如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
// 但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func SaveSysCasbinRuleStruct(ctx context.Context, syscasbinrulestruct *model.SysCasbinRuleStruct) error {

	// syscasbinrulestruct对象指针不能为空
	if syscasbinrulestruct == nil {
		return errors.New("syscasbinrulestruct对象指针不能为空")
	}
	//匿名函数return的error如果不为nil,事务就会回滚
	_, errSaveSysCasbinRuleStruct := zorm.Transaction(ctx, func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始

		_, errSaveSysCasbinRuleStruct := zorm.Insert(ctx, syscasbinrulestruct)

		if errSaveSysCasbinRuleStruct != nil {
			return nil, errSaveSysCasbinRuleStruct
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if errSaveSysCasbinRuleStruct != nil {
		errSaveSysCasbinRuleStruct := fmt.Errorf("service.SaveSysCasbinRuleStruct错误:%w", errSaveSysCasbinRuleStruct)
		logger.Error(errSaveSysCasbinRuleStruct)
		return errSaveSysCasbinRuleStruct
	}

	return nil
}

// UpdateSysCasbinRuleStruct 更新
// 如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
// 如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
// 如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
// 但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func UpdateSysCasbinRuleStruct(ctx context.Context, syscasbinrulestruct *model.SysCasbinRuleStruct) error {

	// syscasbinrulestruct对象指针或主键Id不能为空
	if syscasbinrulestruct == nil || syscasbinrulestruct.Id == 0 {
		return errors.New("syscasbinrulestruct对象指针或主键Id不能为空")
	}

	//匿名函数return的error如果不为nil,事务就会回滚
	_, errUpdateSysCasbinRuleStruct := zorm.Transaction(ctx, func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始
		_, errUpdateSysCasbinRuleStruct := zorm.Update(ctx, syscasbinrulestruct)

		if errUpdateSysCasbinRuleStruct != nil {
			return nil, errUpdateSysCasbinRuleStruct
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if errUpdateSysCasbinRuleStruct != nil {
		errUpdateSysCasbinRuleStruct := fmt.Errorf("service.UpdateSysCasbinRuleStruct错误:%w", errUpdateSysCasbinRuleStruct)
		logger.Error(errUpdateSysCasbinRuleStruct)
		return errUpdateSysCasbinRuleStruct
	}

	return nil
}

// UpdateNotZeroSysCasbinRuleStruct 更新
// 如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
// 如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
// 如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
// 但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func UpdateNotZeroSysCasbinRuleStruct(ctx context.Context, syscasbinrulestruct *model.SysCasbinRuleStruct) error {

	// syscasbinrulestruct对象指针或主键Id不能为空
	if syscasbinrulestruct == nil || syscasbinrulestruct.Id == 0 {
		return errors.New("syscasbinrulestruct对象指针或主键Id不能为空")
	}

	//匿名函数return的error如果不为nil,事务就会回滚
	_, errUpdateSysCasbinRuleStruct := zorm.Transaction(ctx, func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始
		_, errUpdateSysCasbinRuleStruct := zorm.UpdateNotZeroValue(ctx, syscasbinrulestruct)

		if errUpdateSysCasbinRuleStruct != nil {
			return nil, errUpdateSysCasbinRuleStruct
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if errUpdateSysCasbinRuleStruct != nil {
		errUpdateSysCasbinRuleStruct := fmt.Errorf("service.UpdateNotZeroSysCasbinRuleStruct错误:%w", errUpdateSysCasbinRuleStruct)
		logger.Error(errUpdateSysCasbinRuleStruct)
		return errUpdateSysCasbinRuleStruct
	}

	return nil
}

// DeleteSysCasbinRuleStructById 根据Id删除
// 如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
// 如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
// 如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
// 但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func DeleteSysCasbinRuleStructById(ctx context.Context, id string) error {

	//id不能为空
	if len(id) < 1 {
		return errors.New("id不能为空")
	}

	//匿名函数return的error如果不为nil,事务就会回滚
	_, errDeleteSysCasbinRuleStruct := zorm.Transaction(ctx, func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始
		finder := zorm.NewDeleteFinder(model.SysCasbinRuleStructTableName).Append(" WHERE id=?", id)
		_, errDeleteSysCasbinRuleStruct := zorm.UpdateFinder(ctx, finder)

		if errDeleteSysCasbinRuleStruct != nil {
			return nil, errDeleteSysCasbinRuleStruct
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if errDeleteSysCasbinRuleStruct != nil {
		errDeleteSysCasbinRuleStruct := fmt.Errorf("service.DeleteSysCasbinRuleStruct错误:%w", errDeleteSysCasbinRuleStruct)
		logger.Error(errDeleteSysCasbinRuleStruct)
		return errDeleteSysCasbinRuleStruct
	}

	return nil
}

// FindSysCasbinRuleStructById 根据Id查询信息
// ctx中如果没有dbConnection,则会使用默认的datasource进行无事务查询
func FindSysCasbinRuleStructById(ctx context.Context, id string) (*model.SysCasbinRuleStruct, error) {
	//id不能为空
	if len(id) < 1 {
		return nil, errors.New("id不能为空")
	}

	//根据Id查询
	finder := zorm.NewSelectFinder(model.SysCasbinRuleStructTableName).Append(" WHERE id=?", id)
	syscasbinrulestruct := model.SysCasbinRuleStruct{}
	has, errFindSysCasbinRuleStructById := zorm.QueryRow(ctx, finder, &syscasbinrulestruct)

	//记录错误
	if errFindSysCasbinRuleStructById != nil {
		errFindSysCasbinRuleStructById := fmt.Errorf("service.FindSysCasbinRuleStructById错误:%w", errFindSysCasbinRuleStructById)
		logger.Error(errFindSysCasbinRuleStructById)
		return nil, errFindSysCasbinRuleStructById
	}

	if !has {
		return nil, nil
	}

	return &syscasbinrulestruct, nil

}

// FindSysCasbinRuleStructList 根据Finder查询列表
// ctx中如果没有dbConnection,则会使用默认的datasource进行无事务查询
func FindSysCasbinRuleStructList(ctx context.Context, finder *zorm.Finder, page *zorm.Page) ([]model.SysCasbinRuleStruct, error) {

	//finder不能为空
	if finder == nil {
		return nil, errors.New("finder不能为空")
	}

	syscasbinrulestructList := make([]model.SysCasbinRuleStruct, 0)
	errFindSysCasbinRuleStructList := zorm.Query(ctx, finder, &syscasbinrulestructList, page)

	//记录错误
	if errFindSysCasbinRuleStructList != nil {
		errFindSysCasbinRuleStructList := fmt.Errorf("service.FindSysCasbinRuleStructList错误:%w", errFindSysCasbinRuleStructList)
		logger.Error(errFindSysCasbinRuleStructList)
		return nil, errFindSysCasbinRuleStructList
	}

	return syscasbinrulestructList, nil
}
